package com.framework.modules.chat.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.framework.common.annotation.Login;
import com.framework.common.config.SystemConfigName;
import com.framework.common.utils.HttpContextUtils;
import com.framework.common.utils.QuickHelper;
import com.framework.modules.chat.entity.ChatFriendEntity;
import com.framework.modules.chat.service.ChatFriendService;
import com.framework.modules.dataview.entity.ViewChatFriendInfoListEntity;
import com.framework.modules.dataview.service.ViewChatFriendInfoListService;
import com.framework.modules.sys.service.SysMessageService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.DependsOn;
import org.springframework.web.bind.annotation.*;

import com.framework.modules.chat.service.ChatMessageService;
import com.framework.common.utils.R;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;


/**
 * 聊天消息表 
 *
 * @author MIT
 * @email litmiss@gmail.com
 * @date 2020-10-30 02:44:49
 */
@RestController
@RequestMapping("/chat")
@Api(tags = "聊天")
public class ChatMessageController {
    @Autowired
    private ChatMessageService chatMessageService;

    @Autowired
    private ChatFriendService chatFriendService;

    @Autowired
    private SysMessageService sysMessageService;

    @Autowired
    private ViewChatFriendInfoListService viewChatFriendInfoListService;

    /**
     * 聊天/好友列表
     * 数据库 [ 聊天联系人 ]  tb_chat_friend
     *
     * @param query 用户昵称或友街id
     * @return {
     * "adddate": 0,//创建时间
     * "avanta": "http://app-dev-1301591806.cos.ap-shanghai.myqcloud.com/assets/user/defaultAvatar/101.png",//头像
     * "blockCount": 0, //消息更新数 扩展不用
     * "blockDate": 0,//消息更新时间 扩展不用
     * "blockMessage": "",//消息更新内容 在好友列表中显示最新的消息
     * "id": 1,//
     * "lastUpdate": 0,//更新时间
     * "nickname": "我的世界",//用户昵称
     * "state": 1,// 状态 已关注=1,陌生人=0,互相关注=2
     * "targetNickname": "哈哈哈",//备注名称
     * "targetUid": 15,//好友uid
     * "uid": 8 //用户编号
     * }
     */
    @Login
    @GetMapping("/get_friend_list")
    @ApiOperation("聊天好友列表")
    public R getFriendList(@RequestParam(required = false) String query) {
        Long uid = (Long) HttpContextUtils.getHttpServletRequestHeaderValue("uid");
        if (uid == null) {
            return R.error("请登录");
        }
        EntityWrapper<ViewChatFriendInfoListEntity> entityEntityWrapper = new EntityWrapper<>();
        if (StringUtils.isNotBlank(query)) {
            entityEntityWrapper.like("target_nickname", query);
        }
        List<ViewChatFriendInfoListEntity> object = viewChatFriendInfoListService.selectList(entityEntityWrapper.eq("uid", uid).eq("state", 2));
        return R.ok(object);
    }


    /**
     * 聊天/陌生人列表
     * 数据库 [ 聊天联系人 ]  tb_chat_friend
     *
     * @param query 用户昵称或友街id
     * @return {
     * "adddate": 0,//创建时间
     * "avanta": "http://app-dev-1301591806.cos.ap-shanghai.myqcloud.com/assets/user/defaultAvatar/101.png",//头像
     * "blockCount": 0, //消息更新数 扩展不用
     * "blockDate": 0,//消息更新时间 扩展不用
     * "blockMessage": "",//消息更新内容 在好友列表中显示最新的消息
     * "id": 1,//
     * "lastUpdate": 0,//更新时间
     * "nickname": "我的世界",//用户昵称
     * "state": 0,// 状态 已关注=1,陌生人=0,互相关注=2
     * "targetNickname": "哈哈哈",//备注名称
     * "targetUid": 15,//好友uid
     * "uid": 8 //用户编号
     * }
     */
    @Login
    @GetMapping("/get_stranger_list")
    @ApiOperation("聊天陌生人列表")
    public R getStrangerList(@RequestParam(required = false) String query) {
        Long uid = (Long) HttpContextUtils.getHttpServletRequestHeaderValue("uid");
        if (uid == null) {
            return R.error("请登录");
        }
        EntityWrapper<ViewChatFriendInfoListEntity> entityEntityWrapper = new EntityWrapper<>();
        if (StringUtils.isNotBlank(query)) {
            entityEntityWrapper.like("target_nickname", query);
        }
        List<ViewChatFriendInfoListEntity> object = viewChatFriendInfoListService.selectList(entityEntityWrapper.eq("uid", uid).ne("state", 2));
        return R.ok(object);
    }

    /**
     * 聊天/好友消息
     * 数据库 [ 聊天消息表 ]  tb_chat_message
     *
     * @param page 页码
     * @return type 消息类型 文字=1,图片=2,动态表情=3,音频=4,文件=5,红包=6,位置=8
     * sys 是否系统消息 是=1,否=0
     * from_uid 发送者
     * to_uid 接受者
     * content 消息内容
     * state 状态 已读=1,未读=0
     * adddate 发送时间
     */
    @Login
    @GetMapping("/get_message_list")
    @ApiOperation("聊天好友消息")
    public R getStrangerList(Integer page, String friendUid) {
        Long uid = (Long) HttpContextUtils.getHttpServletRequestHeaderValue("uid");
        if (friendUid == null) {
            return R.error("参数错误");
        }
        Map<String, Object> para = new HashMap<>();
        para.put("page", page.toString());
        para.put("limit", QuickHelper.getConfigString(SystemConfigName.RECORD_POST_PAGE_COUNT));
        para.put("to_uid", uid);
        para.put("from_uid", friendUid);
        //更新未读消息为零
        ChatFriendEntity chatFriendEntity = new ChatFriendEntity();
        chatFriendEntity.setUid(uid.intValue());
        chatFriendEntity.setTargetUid(Integer.valueOf(friendUid));
        chatFriendEntity.setBlockCount(0);
        chatFriendService.update(chatFriendEntity, new EntityWrapper<ChatFriendEntity>().eq("uid", uid).eq("target_uid", friendUid));
        return R.ok(chatMessageService.queryPage(para));
    }

    /**
     * 聊天/系统消息
     * 数据库 [ 聊天消息表 ]  tb_chat_message
     * @param page 页码
     * @return type 消息类型 文字=1,图片=2,动态表情=3,音频=4,文件=5,红包=6,位置=8
     * content 消息内容
     * receive_uids 接受者 全部=all,部分用户uid=11,22,33（暂不实现）
     * adddate 发送时间
     */
    @Login
    @CrossOrigin
    @GetMapping("/get_sys_message_list")
    @ApiOperation("系统消息")
    public R getSysMessageList(@RequestParam(value = "page",defaultValue = "1") Integer page) {
        Long uid = (Long) HttpContextUtils.getHttpServletRequestHeaderValue("uid");
        if (uid == null){
            return R.error("您的 token 不存在或者已经失效，请登陆后查看");
        }
        Map<String, Object> para = new HashMap<>();
        para.put("page", page.toString());
        para.put("limit", QuickHelper.getConfigString(SystemConfigName.RECORD_POST_PAGE_COUNT));
        return R.ok(sysMessageService.queryPage(para));
    }

}
